package com.spzx.product.api.factory;

import com.spzx.product.api.RemoteProductService;
import com.spzx.product.api.domain.ProductSku;
import com.spzx.product.api.vo.SkuPriceVo;
import com.spzx.product.api.vo.ProductSkuVo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.spzx.common.core.domain.R;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.context.annotation.Configuration;

import java.util.List;

/**
 * 实现RemoteProductService的回退工厂类
 * 用于在远程产品服务调用失败时创建回退实例
 * 产品服务降级处理
 *
 * @author spzx
 */
@Configuration
public class RemoteProductFallbackFactory implements FallbackFactory<RemoteProductService>
{
    // 日志对象，用于记录服务调用失败的信息
    private static final Logger log = LoggerFactory.getLogger(RemoteProductFallbackFactory.class);

    /**
     * 创建一个RemoteProductService的回退实例
     *
     * @param throwable 导致服务调用失败的异常
     * @return 返回一个回退的RemoteProductService实例
     */
    @Override
    public RemoteProductService create(Throwable throwable)
    {
        // 记录产品服务调用失败的日志信息
        log.error("产品服务调用失败:{}", throwable.getMessage());
        // 返回一个回退实例，该实例在调用时返回失败的结果，并包含错误信息
        return
                new RemoteProductService()
                {
                    @Override
                    public R<ProductSkuVo> getProductSku(Long skuId, String source) {
                        return R.fail("获取商品sku失败:" + throwable.getMessage());
                    }

                    @Override
                    public R<SkuPriceVo> getSkuPrice(Long skuId, String source) {
                        return R.fail("获取商品sku价格失败:" + throwable.getMessage());
                    }

                    @Override
                    public R<List<SkuPriceVo>> getSkuPriceList(List<Long> skuIdList, String source) {
                        return R.fail("获取商品sku价格列表失败:" + throwable.getMessage());
                    }

                };
    }
}
